home *** CD-ROM | disk | FTP | other *** search
/ Aminet 51 / Aminet 51 (2002)(GTI - Schatztruhe)[!][Oct 2002].iso / Aminet / util / cli / CopyHead.lha / CopyHead.c next >
Encoding:
C/C++ Source or Header  |  2002-07-06  |  2.1 KB  |  84 lines

  1. /* Copy n bytes from the source-file to a dest-file
  2. **
  3. ** Rudolph Riedel <rudolph-riedel@t-online.de> 
  4. ** 
  5. ** V1.0 02-07-05
  6. **
  7. ** This is public-domain, do whatever you like with this code.
  8. **
  9. **
  10. */
  11.  
  12. #include <clib/exec_protos.h>
  13. #include <clib/dos_protos.h>
  14. #include <clib/alib_stdio_protos.h>
  15.  
  16.  
  17. UBYTE VerstrA[]="$VER: CopyHead 1.0 (02-07-05) R.Riedel";
  18.  
  19. int main(void)
  20. {
  21. struct RDArgs *rda;
  22. LONG vec[3], length=1000, buffersize, readlength, status, i=0, filesize;
  23. BPTR  fIn,fOut;
  24. UBYTE *Globuff;
  25. struct FileInfoBlock *fib;
  26.  
  27. vec[0]=vec[1]=0;
  28. vec[2]=(LONG)&length;
  29. buffersize=readlength=32000;
  30.  
  31. if((rda = ReadArgs("Source/A,Dest/A,Length/N",vec,NULL)) != NULL)
  32.  {
  33.   length = *(const LONG *) vec[2];
  34.  
  35.   if(fIn=Lock((STRPTR)vec[0], ACCESS_READ))
  36.    {
  37.     if(fib=AllocMem(sizeof(struct FileInfoBlock),MEMF_PUBLIC))
  38.      {
  39.       if(Examine(fIn,fib))
  40.        {
  41.         filesize=fib->fib_Size;
  42.         UnLock(fIn);
  43.         if(filesize < length) length=filesize;
  44.         if(length < buffersize) readlength=length;
  45.         filesize=0;
  46.         if(fIn=Open((STRPTR)vec[0],MODE_OLDFILE))
  47.          {
  48.           if(fOut=Open((STRPTR)vec[1],MODE_NEWFILE))
  49.            {
  50.             if(Globuff=(UBYTE *)AllocMem(buffersize,MEMF_PUBLIC|MEMF_CLEAR))
  51.              {
  52.               status=1;
  53.               while(status>0&&(i=Read(fIn,Globuff,readlength))>0)
  54.                {
  55.                 status=Write(fOut,Globuff,i);
  56.                 if(status!=i)
  57.                  {
  58.                   status=(-1);
  59.                  }
  60.                 filesize+=i;
  61.                 if(filesize == length) status=0;
  62.                 if((filesize+buffersize)>length) readlength=length-filesize;
  63.                }
  64.               Close(fOut);
  65.               if(status==-1||i==-1)
  66.                {
  67.                 Fault(IoErr(),NULL,Globuff,FAULT_MAX);
  68.                 Printf(Globuff,0);
  69.                 DeleteFile((STRPTR)vec[1]);
  70.                }
  71.               FreeMem(Globuff,buffersize);
  72.              }
  73.            }
  74.           Close(fIn);
  75.          }
  76.        }
  77.       FreeMem(fib,sizeof(struct FileInfoBlock));
  78.      }
  79.    }
  80.   FreeArgs(rda);
  81.  }
  82. return 1;
  83. }
  84.